perm filename DAP[AP,SYS] blob sn#023123 filedate 1973-02-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	DAP
C00004 00003	Flags and storage allocation
C00006 00004	REDAP--initialization
C00007 00005	Main loop
C00008 00006	DAP2    NXSTY   DSPLAY
C00011 00007	MOVEUP  MOVEDN  REDRAW  ORIGI   FOLLOW  LEAVE   EDDT    ALTER   NO      OUTSEQ
C00013 00008	BACK    BACK1   AHEAD   AHEAD1  NEWEST  OLDEST  TOP     BOTTOM
C00015 00009	NEXT    LAST    PRSTY   PLUS    MINUS
C00017 00010	INNBR   RDNBR   PTZERO  PRNTNO  NXTDG
C00019 00011	READIT
C00023 00012	READ    GETCH
C00024 00013	CLEAR   DISP
C00026 00014	CHRTBL
C00028 ENDMK
C⊗;
	TITLE	DAP

EXTERN $I,JOBDDT

F←←0
A←1
B←2
C←3
D←4
S←5
X←6
N←7

P←17

CR←←15  LF←←12  FF←←14  VT←←13  ALT←←175  TAB←←11

; DATA-DISC MACROS AND DEFINITIONS
; COMMAND WORD -- ALTERNATING COMMANDS AND PARAMETERS
DEFINE CW(C1,B1,C2,B2,C3,B3) <
	<BYTE (8)<B1>,<B2>,<B3> (3)<C1>,<C2>,<C3>>!4
>

; COMMAND NAMES FOR DD COMMAND BYTES
EXCT←←0				;EXECUTE
FNCN←←1  ALPHBG←←16  ALPHA←←46	;FUNCTION, USUAL VALUE BYTES
CHNL←←2				;CHANNEL SELECT
COLM←←3				;COLUMN SELECT
HILIN←←4			;HIGH 5 BITS OF LINE
LOLIN←←5			;LOW 5 BITS OF LINE

OPDEF DDUPG  [PGIOT 3,]
OPDEF SLEEP  [CALLI 31]
OPDEF EXIT   [CALLI 12]
OPDEF SNEAKW [CALLI 400063]
OPDEF INSKIP [TTYUUO 13,]
OPDEF SETACT [TTYUUO 15,]
;Flags and storage allocation

;LEFT HALF FLAGS
BACKUP←←      1	; 1 if we want to display the last frame of a story

FRSIZE←←=15
MAXFRS←←20

SPECS←←4
XSIZE←←3
MAXNBR←=500
XLEN←MAXNBR*XSIZE+SPECS

PDLEN←←40

PDLIST:	BLOCK	PDLEN

STORY:	BLOCK	2200
INDEX:	BLOCK	XLEN
FREND:	BLOCK	MAXFRS+1
STUFF:	BLOCK	20
DIGITS:	BLOCK	4
SEQNBR:	0
LINEBP:	0
BRCHAR:	0
FRAME:	0
LASTFR:	0

NEWSF:	SIXBIT	/NEWS/
	BLOCK	3

CMD:	IOWD	1,STORY
	0

INDEXF:	SIXBIT	/INDEX/
	BLOCK	3

XCMD:	IOWD	XLEN,INDEX
	0

DSK17:	17
	SIXBIT	/DSK/
	0

DDERAS:	CW FNCN,17,CHNL,0,FNCN,ALPHA
	0
DDHDR:	200000,,
	BLOCK	3

DEFINE	UNDUNX	{INDEX}
DEFINE	NEWX	{INDEX+1}
DEFINE	OLDX	{INDEX+2}

DEFINE	ERROR (MSG)  {
JRST	[OUTSTR	[ASCIZ ⊗
MSG
⊗]
	 HALT .+1]
}

CRLF:	ASCIZ/
/
;REDAP--initialization

REDAP:	OUTSTR	[ASCIZ/ RESTARTING/]
DAP:	MOVE	P,[IOWD PDLEN,PDLIST]
	PPSEL	1
	OPEN	0,DSK17
	ERROR	OPEN FAILED ON DSK
	MOVE	A,[' APSYS']
	MOVEM	A,INDEXF+3
	LOOKUP	0,INDEXF
	ERROR	LOOKUP FAILED ON INDEX
	IN	0,XCMD
	JRST	.+2
	ERROR	IN FAILED ON INDEX
	RELEAS	0,
	SETZM	SEQNBR
	MOVE	X,OLDX
DAPC:	PUSHJ	P,CLEAR			;clear screen and position pp at bottom
	SETACT	[0,,[-1↔777700037777↔-1↔777777600000]];activate on anything but digits
	SETLIN	[000120,,0]
	JRST	BACK1
;Main loop

NOTFND:	OUTSTR	[ASCIZ/ NOT FOUND./]
DAP0:	OUTSTR	[ASCIZ/ OK
/]
DAP1:	TLZ	F,BACKUP
	INCHWL	C
	MOVE	X,CURX
	LDB	A,[POINT 2,C,28]	;grab control bits
	ANDI	C,177			;and zero them
	JRST	@CHRTBL(C)
;DAP2    NXSTY   DSPLAY

NUMBER:	PUSH	P,C
	PUSHJ	P,READ
	POP	P,C
	PUSHJ	P,RDNBR

DAP2:	MOVEM	N,SEQNBR
	MOVE	X,OLDX
	JRST	NXSTY2
NXSTY:	OUTSTR	[ASCIZ/LATER STORY #/]
	MOVE	C,SEQNBR
	PUSHJ	P,PRNTNO
NXSTY1:	ADDI	X,XSIZE
	CAIL	X,XLEN
	MOVEI	X,SPECS
	CAMN	X,NEWX
	JRST	NOTFND
NXSTY2:	HRRZ	A,INDEX+2(X)		;get seq nbr of this story
	CAME	A,SEQNBR
	JRST	NXSTY1

DSPLAY:	PUSHJ	P,READIT			;display the story whose index is in X
	OUTSTR	[ASCIZ / SEQ NBR CALC FAIL /]

	MOVE	A,[-2200,,STORY]
	MOVEI	B,1
	ORM	B,(A)
	AOBJN	A,.-1
	HRLI	D,440700
	SETZ	B,
	MOVEM	D,FREND(B)
	JRST	CTLFS1
CTLFS0:	SOJG	C,CTLFS
	ADDI	B,1
	CAIL	B,MAXFRS
	ERROR	STORY TOO LONG
	MOVEM	D,FREND(B)
CTLFS1:	MOVEI	C,FRSIZE
CTLFS:	ILDB	A,D
	CAIN	A,LF
	JRST	CTLFS0
	JUMPN	A,CTLFS
	MOVEM	D,FREND+1(B)
	MOVEM	D,FREND+2(B)
	SOJG	B,CTLFS2
	SETZ	B,
	JRST	CTLFS3

CTLFS2:	MOVE	C,FREND+1(B)
CTLFS4:	ILDB	A,C
	JUMPE	A,CTLFS5
	CAIE	A,LF
	JRST	CTLFS3
	CAME	C,D
	JRST	CTLFS4
CTLFS5:	SUBI	B,1

CTLFS3:	MOVEM	B,LASTFR
	TLZN	F,BACKUP
	SETZ	B,
	MOVEM	B,FRAME
	PUSHJ	P,DISP
	JRST	DAP0
;MOVEUP  MOVEDN  REDRAW  ORIGI   FOLLOW  LEAVE   EDDT    ALTER   NO      OUTSEQ

MOVEUP:	MOVE	A,FRAME
	CAML	A,LASTFR
	JRST	AHEAD1
	AOS	B,FRAME
	PUSHJ	P,DISP
	JRST	DAP0

MOVEDN:	SKIPG	FRAME
	JRST	[TLO F,BACKUP↔JRST BACK1]
	SOS	B,FRAME
	PUSHJ	P,DISP
	JRST	DAP0

REDRAW:	MOVE	B,FRAME
	PUSHJ	P,DISP
	JRST	DAP0

ORIGI:	OUTSTR	[ASCIZ/ ORIGINAL/]
	HLRZ	X,INDEX+2(X)
	JUMPN	X,DSPLAY
	JRST	NOTFND

FOLLOW:	OUTSTR	[ASCIZ/ FOLLOW UP/]
	HRRE	X,INDEX(X)
	JUMPG	X,DSPLAY
	JRST	NOTFND

LEAVE:	PUSHJ P,CLEAR
	EXIT

EDDT:	SKIPE	JOBDDT
	JSR $I
	JRST DAP0

ALTER:
NO:	OUTSTR	[ASCIZ/ LEGAL COMMANDS ARE: <nbr> FF VT /]
	SETZ	C,
NO1:	HRRZ	B,CHRTBL(C)
	CAIE	B,NUMBER
	CAIN	B,NO
	JRST	NO2
	CAIE	C,VT
	CAIN	C,FF
	JRST	NO2
	OUTCHR	C
	OUTCHR	[" "]
NO2:	ADDI	C,1
	CAIGE	C,"a"
	JRST	NO1
	OUTSTR	CRLF
	JRST	DAP1

OUTSEQ:	MOVE	C,SEQNBR
	PUSHJ	P,PRNTNO
	JRST	DAP0
;BACK    BACK1   AHEAD   AHEAD1  NEWEST  OLDEST  TOP     BOTTOM

BACK:
BACK1:	CAMN	X,OLDX
	JRST	BACK2
BACK3:	SUBI	X,XSIZE
	CAIGE	X,SPECS
	MOVEI	X,XLEN-XSIZE
	JRST	DSPLAY
NEWEST:	
BACK2:	OUTSTR	[ASCIZ/ NEWEST STORY/]
	MOVE	X,NEWX
	JRST	BACK3

AHEAD:
AHEAD1:	ADDI	X,XSIZE
	CAIL	X,XLEN
	MOVEI	X,SPECS
	CAME	X,NEWX
	JRST	DSPLAY
OLDEST:	
AHEAD2:	OUTSTR	[ASCIZ/ OLDEST STORY/]
	MOVE	X,OLDX
	JRST	DSPLAY


TOP:	SETZB	B,FRAME
	PUSHJ	P,DISP
	JRST	DAP0

BOTTOM:	MOVE	B,LASTFR
	MOVEM	B,FRAME
	PUSHJ	P,DISP
	JRST	DAP0
;NEXT    LAST    PRSTY   PLUS    MINUS

PLUS:	PUSHJ	P,READ
	PUSHJ	P,INNBR
	CAILE	N,=150
	MOVEI	N,=150
	IMULI	N,XSIZE
	ADD	X,N
	CAIL	X,XLEN
	SUBI	X,XLEN-SPECS
	JRST	PLMNCK

MINUS:	PUSHJ	P,READ
	PUSHJ	P,INNBR
	CAILE	N,=150
	MOVEI	N,=150
	IMULI	N,XSIZE
	SUB	X,N
	CAIGE	X,SPECS
	ADDI	X,XLEN-SPECS
PLMNCK:	MOVE	A,OLDX
	CAMLE	A,NEWX
	JRST	PLMNC1
	CAML	X,A
	CAML	X,NEWX
	JRST	NOTFND
	JRST	DSPLAY
PLMNC1:	CAML	X,NEWX
	CAML	X,A
	JRST	DSPLAY
	JRST	NOTFND

NEXT:	INCHRW	C
	ANDI	C,177
	CAIE	C,"+"
	ERROR	PLUS SIGN DISAPPEARED
	JUMPN	A,NXSTY
	PUSHJ	P,READ
	PUSHJ	P,INNBR
	JUMPE	N,NXSTY
	MOVEM	N,SEQNBR
	JRST	NXSTY

LAST:	INCHRW	C
	ANDI	C,177
	CAIE	C,"-"
	ERROR	MINUS SIGN DISAPPEARED
	JUMPN	A,PRSTY
	PUSHJ	P,READ
	PUSHJ	P,INNBR
	JUMPE	N,PRSTY
	MOVEM	N,SEQNBR
PRSTY:	OUTSTR	[ASCIZ/EARLIER STORY #/]
	MOVE	C,SEQNBR
	PUSHJ	P,PRNTNO
PRSTY1:	CAMN	X,OLDX
	JRST	NOTFND
	SUBI	X,XSIZE
	CAIGE	X,SPECS
	MOVEI	X,XLEN-XSIZE
	HRRZ	A,INDEX+2(X)
	CAME	A,SEQNBR
	JRST	PRSTY1
	JRST	DSPLAY
;INNBR   RDNBR   PTZERO  PRNTNO  NXTDG

INNBR:	ILDB	C,LINEBP	;load 1st char of number
RDNBR:	SETZ	N,		;CNT will hold the value of the number
RDNBR1:	CAIG	C,"9"		;is present char a digit?
	CAIGE	C,"0"
	POPJ	P,		;no.  return
	IMULI	N,=10		;yes.  multiply previous sum by =10 and
	ADDI	N,-60(C)	;	add in current digit
	ILDB	C,LINEBP	;load the next potential digit
	JRST	RDNBR1

PTZERO:	CAIGE	C,=10
	OUTCHR	["0"]		;print a leading zero if number is less than ten
PRNTNO:	MOVE	B,[POINT 7,DIGITS]
	PUSHJ	P,NXTDG
	SETZ	C,
	IDPB	C,B
	OUTSTR	DIGITS
	POPJ	P,

NXTDG:	IDIVI	C,=10
	PUSH	P,D
	SKIPE	C
	PUSHJ	P,NXTDG
	POP	P,C
	ADDI	C,60
	IDPB	C,B
	POPJ	P,
;READIT

READIT:	HRRZ	D,INDEX+1(X)		;get the story's displ from beginning of rec
	MOVE	S,X			;calculate the index of the next story
	ADDI	S,XSIZE
	CAIL	S,XLEN
	MOVEI	S,SPECS
	MOVN	S,INDEX+1(S)		;subtract the rec nbr and displ of next story from zero
	ADD	S,INDEX+1(X)		;	and add in the rec nbr and displ of the
	JUMPL	S,ONWARD		;	current story. this gets negated size of current story
DOWN:	MOVN	S,INDEX+3		;the current story is the bottom one in NEWS
	JUMPN	S,.+2			;zero means this is a fake story. NEWS has never wrapped around
	ERROR	FAKE STORY
	ADD	S,INDEX+1(X)		;recalculate its size using ptr to bottom of file
ONWARD:	ASH	S,-13
;shift out the =11 low order zero bits of the size
	ASH	D,-13			;shift out the =11 low order zero bits of the displ
	MOVNM	S,TOTSIZ#		;save the size of the story (positive size)
	SUB	S,D			;add in the displ to get the amt that has to be read in
	HRLM	S,CMD			;store this amt (negated) in the input command
AGAIN1:	OPEN	4,DSK17			;LOOKUP the NEWS file for reading in the story
	ERROR	OPEN FAILED ON DSK
	MOVE	A,[' APSYS']
	MOVEM	A,NEWSF+3		;store ppn of [ap,sys] in lookup block
	LOOKUP	4,NEWSF
	JRST	[RELEASE 4,		;NEWS file in use. wait and try the LOOKUP again
		 MOVEI	A,1
		 SLEEP	A,
		 JRST	AGAIN1]
	HLRZ	A,INDEX+1(X)		;get the record nbr for this story
	USETI	4,(A)			;select that record for input from NEWS
	IN	4,CMD			;read in the story in STORY area
	JRST	.+2
	ERROR	IN UUO FAILED TO READ IN NEWS STORY
	RELEAS	4,

	ADDI	D,STORY			;make DISPL into ptr to first word of the story
	MOVEM	D,BEGS#
	MOVEM	X,CURX#
	LDB	B,[POINT 7,(D),6]	;CALCULATE APPARENT SEQ NBR OF STORY READ
	SUBI	B,60			;	IN FROM NEWS
	IMULI	B,=10
	LDB	C,[POINT 7,(D),13]
	ADDI	B,-60(C)
	IMULI	B,=10
	LDB	C,[POINT 7,(D),20]
	ADDI	B,-60(C)
	HRRZ	A,INDEX+2(X)	;GET SEQ NBR FROM INDEX FOR THIS STORY
	CAMN	A,B		;CHECK CALCULATED SEQ NBR AGAINST THAT IN INDEX
	AOS	(P)
	POPJ	P,
;READ    GETCH

READ:	MOVE	B,[POINT 7,STUFF];read in a line typed
	MOVEM	B,LINEBP
READ1:	INCHWL	C
	CAIN	C,CR
	JRST	READ4
	CAIE	C,LF
	CAIN	C,ALT
	JRST	READ5
	IDPB	C,B		;save the char
	TRNN	C,600		;any control bits on?
	JRST	READ1		;nope
	JRST	READ5
READ4:	INCHWL	C
READ5:	MOVEM	C,BRCHAR
	SETZ	C,
	IDPB	C,B
	POPJ	P,

GETCH:	ILDB	C,LINEBP	;get next char from tty
GETCH1:	CAIE	C," "		; not counting spaces
	CAIN	C,TAB		; or tabs
	JRST	GETCH
	POPJ	P,
;CLEAR   DISP

CLEAR:	DDUPG	[DDERAS↔2]
	DPYPOS	-630
	DPYSIZ	4001
	POPJ	P,

DISP:	INSKIP
	JRST	.+2
	POPJ	P,
	PUSHJ	P,CLEAR
	MOVE	A,FREND(B)
	MOVE	C,FREND+2(B)
	PUSH	P,-2(A)
	PUSH	P,-1(A)
	PUSH	P,(A)
	PUSH	P,(C)
	PUSH	P,1(C)

	MOVE	D,[CW FNCN,ALPHA,CHNL,0,FNCN,ALPHA]
	MOVEM	D,-2(A)
	MOVE	D,[CW COLM,2,HILIN,2,LOLIN,4]
	MOVEM	D,-1(A)
	MOVEI	D,-2(A)
	HRRM	D,DDHDR
	ADDI	D,1
	MOVEM	D,DDHDR+3
	SUBI	D,3(C)
	MOVNM	D,DDHDR+1

	SETZ	B,
	JRST	DISP2
DISP1:	DPB	B,A
	HLRZ	D,A
	ADDI	D,070000
	HRL	A,D
DISP2:	JUMPGE	A,DISP1
	JRST	DISP4

DISP3:	IDPB	B,C
DISP4:	TLNE	C,760000
	JRST	DISP3
	SETZM	1(C)

	DDUPG	DDHDR
	POP	P,1(C)
	POP	P,(C)
	POP	P,(A)
	POP	P,-1(A)
	POP	P,-2(A)	
	POPJ	P,
;CHRTBL

CHRTBL:	NO	;NULL
	FOLLOW	;↓
	NO	;α
	NO	;β
	NO	;∧
	NO	;¬
	NO	;ε
	NO	;π
	NO	;λ
	NO	;TAB
	NO	;LF
	MOVEDN	;VT
	MOVEUP	;FF
	NO	;CR
	NO	;∞
	NO	;∂
	NO	;⊂
	NO	;⊃
	NO	;∩
	NO	;∪
	NO	;∀
	NO	;∃
	NO	;⊗
	NO	;↔
	NO	;_
	NXSTY	;→
	NO	;~
	NO	;≠
	NO	;≤
	NO	;≥
	NO	;≡
	NO	;∨
	NO	;SPACE
	NO	;!
	NO	;"
	NO	;#
	NO	;$
	NO	;%
	NO	;&
	NO	;'
	NO	;(
	NO	;)
	NO	;*
	PLUS	;+
	NO	;,
	MINUS	;-
	NO	;.
	NO	;/
	NUMBER	;0
	NUMBER	;1
	NUMBER	;2
	NUMBER	;3
	NUMBER	;4
	NUMBER	;5
	NUMBER	;6
	NUMBER	;7
	NUMBER	;8
	NUMBER	;9
	NO	;:
	NO	;;
	BACK	;<
	OUTSEQ	;=
	AHEAD	;>
	NO	;?
	NO	;@
	ALTER	;A
	BOTTOM	;B
	NO	;C
	EDDT	;D
	LEAVE	;E
	NO	;F
	NO	;G
	NO	;H
	NO	;I
	NO	;J
	NO	;K
	NO	;L
	NO	;M
	NEWEST	;N
	OLDEST	;O
	NO	;P
	NO	;Q
	NO	;R
	REDAP	;S
	TOP	;T
	NO	;U
	REDRAW	;V
	NO	;W
	NO	;X
	NO	;Y
	NO	;Z
	NO	;[
	NO	;\
	NO	;]
	ORIGI	;↑
	PRSTY	;←
	NO	;`
	ALTER	;a
	BOTTOM	;b
	NO	;c
	EDDT	;d
	LEAVE	;e
	NO	;f
	NO	;g
	NO	;h
	NO	;i
	NO	;j
	NO	;k
	NO	;l
	NO	;m
	NEWEST	;n
	OLDEST	;o
	NO	;p
	NO	;q
	NO	;r
	REDAP	;s
	TOP	;t
	NO	;u
	REDRAW	;v
	NO	;w
	NO	;x
	NO	;y
	NO	;z
	NO	;{
	NO	;|
	NO	;ALT
	NO	;}
	NO	;BS

	END	DAP